---
title: Netty
---


Netty是一个基于Java NIO（Non-blocking I/O）的网络通信框架，用于快速开发可维护的高性能服务器和客户端。它提供了简单易用的API，使得网络编程变得更加轻松。



![img](https://img.wkq.pub/img/components.png)

<!-- more -->
在 Java 中，内存是分为堆和栈、字符串常量池，如果我们有一些数据需要从 IO 中读取，并且放到堆中，其实会经过一些缓冲区。

在读的过程中，会有两个步骤。
第一步：将数据从 IO流 中读取到缓冲区中。
第二步：将缓冲区中的数据读取到堆中。
数据会拷贝两次才会到达堆中，这样就会造成资源的浪费。

Netty 使用了 NIO 中的零拷贝技术，当需要接受数据或者传递数据的时候，会开辟一个直接内存，将数据直接放到直接内存中，然后将直接内存的地址传递给堆中，这样就只需要拷贝一次就可以了。

## 能做什么

- **服务器和客户端**: 可以快速创建自定义协议的服务器和客户端，实现高效的通信。
- **WebSocket服务器**: 可以构建实时Web应用，如在线聊天，通知系统等。
- **HTTP服务器**: 可以构建高性能的HTTP服务器，用于服务Web请求。
- **UDP服务器和客户端**: 可以实现UDP通信，用于实时音视频流、游戏等。

## 线程模型（Reactor线程模型）
Netty 提供了三种线程模型。

### 单线程模型

所有的 IO 操作都是由同一个 `NIO` 线程处理的

![image-20230924114848712](https://img.wkq.pub/img/image-20230924114848712.png)

作为服务端，用于接受客户端所有的连接；如果作为客户端，就会向服务端发起连接，同时又可以读取请求、响应消息、发送请求。

这种线程模型使用的是 异步非阻塞的 IO，所有的 IO操作都不会阻塞。

在小型的应用场景，使用单线程模型是没有问题的。

但是在一些额外的场景，比如:高负载、大并发的场景，使用单线程就不太合适，这主要是因为 一个 NIO 的线程同时处理成百上千以及上万的请求的时候，性能会下降的非常严重。

这样导致的结果就是，客户端的请求会被阻塞，响应时间会变长，甚至超时，这样会导致服务端请求堆积，最终导致服务端内存溢出。
### 多线程模型
由一组 NIO 线程处理 IO 操作

![image-20230924115727216](https://img.wkq.pub/img/image-20230924115727216.png)

Reactor 单线程用于处理客户端连接，然后会把所有请求都注册到 线程池。

由一个专门的 NIO 线程去监听服务器，去接受客户端相应的请求。其它的一些读写请求则由线程池去处理。

在绝大多数情况下，多线程模型都适用，但是如果达到了 百万级别的并发，就不太适用了

### 主从线程模型

一组线程池接受请求，一组线程池处理 IO

![image-20230924120157993](https://img.wkq.pub/img/image-20230924120157993.png)

主线程用于处理客户端的登录、握手、安全认证等等，一旦客户端连接建立完毕，就会把客户端丢到从线程池里面去。

这种线程模型是 Netty 官方推荐使用的线程模型。

## Channel 初始化器

每一个 channel 由多个 handler 共同组成管道（`pipline`）

![image-20230924130454035](https://img.wkq.pub/img/image-20230924130454035.png)

当涉及实时通信时，常用的技术包括AJAX轮询、Long Polling和WebSocket。以下是对这些技术的简洁解释，采用Markdown格式：

---

## 实时通信技术简介

### 1. AJAX 轮询 (AJAX Polling)

- **原理**：客户端定时向服务器发送HTTP请求，询问是否有新数据。
- **优点**：简单易实现，适用于大部分现代浏览器。
- **缺点**：效率低，可能造成服务器负担过重，不适合高频率的实时通信。

### 2. Long Polling (Comet)

- **原理**：客户端发送HTTP请求，服务器保持连接打开，直到有新数据才响应或超时返回，然后客户端再发起新的请求。
- **优点**：实时性较好，减少了不必要的轮询。
- **缺点**：不适用于大量长连接，依然占用服务器资源，实时性受网络延迟影响。

### 3. WebSocket

- **原理**：WebSocket是一种全双工通信协议，通过单一的TCP连接实现客户端和服务器间的双向通信。
- **优点**：实时性极高，适用于实时聊天、实时游戏等场景。
- **缺点**：需要现代浏览器和服务器的支持，但现代Web应用普遍支持WebSocket。
